home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 3_0 / OIC_1 / OIC_SOUR / OBJECT.C < prev    next >
Text File  |  1989-03-05  |  3KB  |  178 lines

  1.  
  2. /*
  3.  *        Object - the root class, inherited eventually by all classes.
  4.  *
  5.  *            Copyright ⌐ John Wainwright 1988
  6.  *
  7.  *    Supers : None.
  8.  *
  9.  *    Class Vars : None
  10.  *
  11.  *    Class Methods : None
  12.  *
  13.  *    Methods :
  14.  *
  15.  *        new            - dummy new.
  16.  *        className    - returns class name String
  17.  */
  18.  
  19. #include <stdio.h>
  20. #include "oic.h"
  21. #include "generics.h"
  22.  
  23. class Object;                        /* root Object class                 */
  24.  
  25. /* -------------------- Object Instance methods ---------------------------- */
  26.  
  27. method object
  28. _new(self)
  29.     object    self;
  30. {
  31.     return self;
  32. }
  33.  
  34. method object
  35. _className(self)
  36.     object    self;
  37. {
  38.     return New(String, ClassOf(self)->c_name);
  39. }
  40.  
  41. method void
  42. _dispose(self)
  43.     object    self;
  44. {
  45.     *self = NULL;    /* make it an invalid object */
  46.     free(self);
  47. }
  48.  
  49. method object
  50. _print(self)
  51.     object    self;
  52. {
  53.     object replist = repList(self);
  54.     
  55.     print(replist);
  56.     deepDispose(replist);
  57. }
  58.  
  59. method object
  60. _repList(self)
  61.     object    self;
  62. {
  63.     register object    p;
  64.     register int    i, l;
  65.     object            replist;
  66.     char            buf[100];
  67.     
  68.     replist = New(Replist, "<", ">", " ");
  69.     sprintf(buf, "%s:", ClassNameOf(self));
  70.     append(replist, New(String, buf));
  71.     l = ClassOf(self)->c_allocz / sizeof(object);
  72.     for (p = self + 1, i = 1; i < l; i++, p++)
  73.         if (IsObj(*p))
  74.             append(replist, repList(*p));
  75.         else
  76.         {
  77.             sprintf(buf, "%8.8lx", *p);
  78.             append(replist, New(String, buf));
  79.         }
  80.     return replist;
  81. }
  82.  
  83. method object
  84. _cantDo(self, dummy, ap)
  85.     object        self;
  86.     char        *dummy;
  87.     struct 
  88.     {
  89.         GenericTable    *gen;
  90.         char            *args;
  91.     } *ap;
  92. {
  93.     gprintf(error, "** No \"%s\" method for %s\n", GenericName(ap->gen), ClassNameOf(self));
  94.     return END;
  95. }
  96.  
  97. method void
  98. _forAll(self, dummy, ap)
  99.     object    self;
  100.     char    *dummy;
  101.     register struct 
  102.     {
  103.         void    (*f)();
  104.         double    a1, a2, a3, a4, a5;
  105.     } *ap;
  106. {
  107.     object seq, item;
  108.     
  109.     for (seq = sequence(self); item = next(seq); )
  110.         (*ap->f)(item, ap->a1, ap->a2, ap->a3, ap->a4, ap->a5);
  111. }
  112.  
  113. method void
  114. _forAllGen(self, dummy, ap)
  115.     object        self;
  116.     char        *dummy;
  117.     register struct 
  118.     {
  119.         GenericTable    *gen;
  120.         char            *args;
  121.     } *ap;
  122. {
  123.     object seq, item;
  124.     
  125.     for (seq = sequence(self); item = next(seq); )
  126.         ApplyGeneric(ap->gen, item, ap->args);
  127. }
  128.  
  129. method object
  130. _allInstances()
  131. {
  132.     return New(List, END);
  133. }
  134.  
  135. method object
  136. _deepInstances()
  137. {
  138.     return New(List, END);
  139. }
  140.  
  141. method int
  142. _equal(self, ivs, other)
  143.     object    self;
  144.     char    *ivs;
  145.     object    *other;
  146. {
  147.     return (ClassOf(self) == ClassOf(*other) &&
  148.             ClassOf(self)->c_allocz == ClassOf(*other)->c_allocz &&
  149.             strncmp(self, *other, ClassOf(self)->c_allocz));
  150. }
  151.  
  152. /* ------------------- Init the Object class ------------------------------- */
  153.  
  154. /*        
  155.  *        note that the Object has already been made in the ONLY function
  156.  *        that should call this: InitRootClasses in obj.c
  157.  */
  158.  
  159. InitObject()
  160. {
  161.     AddMethods(Object,
  162.         allInstancesGeneric,     _allInstances,
  163.         cantDoGeneric,            _cantDo,
  164.         classNameGeneric,         _className,
  165.         deepDisposeGeneric,       _dispose,
  166.         deepInstancesGeneric,    _deepInstances,
  167.         disposeGeneric,            _dispose,
  168.         equalGeneric,            _equal,
  169.         forAllGeneric,            _forAll,
  170.         forAllGenGeneric,        _forAllGen,
  171.         mapGeneric,             _forAll,
  172.         newGeneric,             _new,
  173.         printGeneric,            _print,
  174.         repListGeneric,            _repList,
  175.         END);
  176. }
  177.  
  178.